#!/bin/bash

# 认证服务智能启动脚本
# 自动处理PID文件冲突和端口占用问题

set -e

# 脚本配置
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
BUILD_DIR="$PROJECT_ROOT/cmake-build-docker-debug"
CONFIG_FILE="$PROJECT_ROOT/config/auth_service_config.yml"
AUTH_SERVICE_BINARY="$BUILD_DIR/src/core_services/auth_service/auth_service"
PID_FILE="/tmp/auth_service.pid"
AUTH_SERVICE_PORT=8008

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m'

# 日志函数
log_info() {
    echo -e "${GREEN}[INFO]${NC} $(date '+%Y-%m-%d %H:%M:%S') $1"
}

log_warn() {
    echo -e "${YELLOW}[WARN]${NC} $(date '+%Y-%m-%d %H:%M:%S') $1"
}

log_error() {
    echo -e "${RED}[ERROR]${NC} $(date '+%Y-%m-%d %H:%M:%S') $1"
}

# 打印横幅
print_banner() {
    echo -e "${BLUE}"
    cat << 'EOF'
    ╔══════════════════════════════════════════════════════════════╗
    ║                  认证服务智能启动工具                         ║
    ║                Auth Service Smart Launcher                  ║
    ║                                                              ║
    ║  自动处理PID文件冲突和端口占用问题                            ║
    ╚══════════════════════════════════════════════════════════════╝
EOF
    echo -e "${NC}"
}

# 检查并清理僵尸PID文件
check_and_cleanup_pid() {
    log_info "检查PID文件状态..."
    
    if [[ -f "$PID_FILE" ]]; then
        log_warn "发现现有PID文件: $PID_FILE"
        
        # 读取PID
        local old_pid=$(cat "$PID_FILE" 2>/dev/null || echo "")
        
        if [[ -n "$old_pid" && "$old_pid" =~ ^[0-9]+$ ]]; then
            # 检查进程是否真的在运行
            if kill -0 "$old_pid" 2>/dev/null; then
                # 检查是否真的是认证服务进程
                local process_cmd=$(ps -p "$old_pid" -o cmd --no-headers 2>/dev/null || echo "")
                if [[ "$process_cmd" == *"auth_service"* ]]; then
                    log_error "认证服务已在运行中！PID: $old_pid"
                    log_error "进程命令: $process_cmd"
                    log_error "如需强制启动，请先运行: ./scripts/cleanup_auth_service.sh"
                    return 1
                else
                    log_warn "PID $old_pid 存在但不是认证服务，清理PID文件"
                    rm -f "$PID_FILE"
                fi
            else
                log_info "PID $old_pid 对应的进程不存在，清理僵尸PID文件"
                rm -f "$PID_FILE"
            fi
        else
            log_warn "PID文件格式异常，清理文件"
            rm -f "$PID_FILE"
        fi
    else
        log_info "未发现PID文件，可以正常启动"
    fi
    
    return 0
}

# 检查端口占用
check_port_availability() {
    log_info "检查端口 $AUTH_SERVICE_PORT 占用情况..."
    
    # 检查端口是否被占用
    local port_usage=""
    if command -v netstat >/dev/null 2>&1; then
        port_usage=$(netstat -tlnp 2>/dev/null | grep ":$AUTH_SERVICE_PORT " || true)
    elif command -v ss >/dev/null 2>&1; then
        port_usage=$(ss -tlnp 2>/dev/null | grep ":$AUTH_SERVICE_PORT " || true)
    fi
    
    if [[ -n "$port_usage" ]]; then
        log_warn "端口 $AUTH_SERVICE_PORT 被占用:"
        echo "$port_usage"
        
        # 尝试找到占用端口的认证服务进程
        local auth_pids=$(ps aux | grep -E "auth_service" | grep -v grep | grep -v "start_auth_service" | awk '{print $2}' || true)
        if [[ -n "$auth_pids" ]]; then
            log_error "发现认证服务进程占用端口: $auth_pids"
            log_error "请先运行清理脚本: ./scripts/cleanup_auth_service.sh"
            return 1
        else
            log_warn "端口被其他进程占用，但将尝试启动（可能使用SO_REUSEADDR）"
        fi
    else
        log_info "端口 $AUTH_SERVICE_PORT 未被占用"
    fi
    
    return 0
}

# 检查二进制文件
check_binary() {
    log_info "检查认证服务二进制文件..."
    
    if [[ ! -f "$AUTH_SERVICE_BINARY" ]]; then
        log_error "认证服务二进制文件不存在: $AUTH_SERVICE_BINARY"
        log_error "请先编译项目: cd $BUILD_DIR && make auth_service -j4"
        return 1
    fi
    
    if [[ ! -x "$AUTH_SERVICE_BINARY" ]]; then
        log_error "认证服务二进制文件不可执行: $AUTH_SERVICE_BINARY"
        return 1
    fi
    
    log_info "二进制文件检查通过: $AUTH_SERVICE_BINARY"
    return 0
}

# 检查配置文件
check_config() {
    log_info "检查配置文件..."
    
    if [[ ! -f "$CONFIG_FILE" ]]; then
        log_error "配置文件不存在: $CONFIG_FILE"
        return 1
    fi
    
    log_info "配置文件检查通过: $CONFIG_FILE"
    return 0
}

# 启动认证服务
start_service() {
    log_info "启动认证服务..."
    log_info "二进制文件: $AUTH_SERVICE_BINARY"
    log_info "配置文件: $CONFIG_FILE"
    log_info "PID文件: $PID_FILE"
    
    # 切换到项目根目录
    cd "$PROJECT_ROOT"
    
    # 启动服务
    exec "$AUTH_SERVICE_BINARY" "$CONFIG_FILE"
}

# 主函数
main() {
    print_banner
    
    local force_start=false
    
    # 解析命令行参数
    while [[ $# -gt 0 ]]; do
        case $1 in
            -f|--force)
                force_start=true
                shift
                ;;
            -h|--help)
                echo "用法: $0 [选项]"
                echo ""
                echo "选项:"
                echo "  -f, --force    强制启动（清理现有进程）"
                echo "  -h, --help     显示帮助信息"
                echo ""
                echo "示例:"
                echo "  $0              # 正常启动"
                echo "  $0 --force      # 强制启动"
                exit 0
                ;;
            *)
                log_error "未知参数: $1"
                echo "运行 '$0 --help' 查看帮助信息"
                exit 1
                ;;
        esac
    done
    
    # 如果是强制启动，先清理
    if [[ "$force_start" == "true" ]]; then
        log_warn "强制启动模式，清理现有进程..."
        if [[ -x "$SCRIPT_DIR/cleanup_auth_service.sh" ]]; then
            "$SCRIPT_DIR/cleanup_auth_service.sh"
        else
            log_warn "清理脚本不存在，手动清理PID文件"
            rm -f "$PID_FILE"
        fi
    fi
    
    # 执行启动前检查
    log_info "=== 启动前检查 ==="
    
    if ! check_binary; then
        exit 1
    fi
    
    if ! check_config; then
        exit 1
    fi
    
    if ! check_and_cleanup_pid; then
        exit 1
    fi
    
    if ! check_port_availability; then
        if [[ "$force_start" != "true" ]]; then
            exit 1
        else
            log_warn "强制启动模式，忽略端口占用警告"
        fi
    fi
    
    log_info "=== 所有检查通过，启动服务 ==="
    
    # 启动服务
    start_service
}

# 执行主函数
main "$@"
